当前位置:  开发笔记 > 程序员 > 正文

什么是`int*userMask [3] [4]`指向?

如何解决《什么是`int*userMask[3][4]`指向?》经验,为你挑选了3个好方法。

我正在修改一些代码并遇到一个声明,我无法理解:

int *userMask[3][4] = {0};

究竟是什么指向?它是一个矩阵,每个元素都是指针吗?或者它指向一个大小的矩阵[3] [4]?

谢谢


我想我的问题是userMask[2][maskElement][user]当声明为什么时可以工作int.userMask不能让它int[]正常工作吗?我不能理解这个权利......

请注意,感谢您对cdecl Robert的建议.但是,有没有人知道如何在XP命令提示符中使用它?我只能得到语法错误:(



1> Johannes Sch..:

简短的回答

给定userMask声明为

int *userMask[3][4];

然后userMask有类型int*[3][4].这是一个指向int的2d数组.外部维度的大小为3,内部维度的大小为4.实际上,这只不过是一个3元素的1d数组,其中元素类型是元素类型为的另一个4元素1d数组int*.

步骤解释

所以,如果你这样做

userMask[2][maskElement][user]

然后基本上使用前两个索引从二维数组中选择特定指针:

int * p = userMask[2][maskElement];

然后你通过这样做选择一个偏离该指针的某个int

p[user]

现在代码全部在userMask[2][maskElement][user].

有效的C代码

要使用有效的c代码一步一步地执行此操作(如果您还不了解以下所有内容,请不要担心):

int * userMask[3][4] = { { 0 } };
int ** pa = userMask[2]; /* int*[4] becomes int** implicitly */
int * pi = pa[maskElement];
int i = pi[user];

assert(i == userMask[2][maskElement][user]);

数组和指针之间的区别

所以我想我告诉你一些重要的事情.上面的数组包含指向数组的指针.让我们看看它们的行为有多么不同,这是许多程序员不期望的:

int array[5][4][3];
/* int[4][3] implicitly converts to int(*)[3] (pointer to first element) */
int (*parray)[3] = array[0]; 
int ** pint = (int**) array[0]; /* wrong!! */

现在,如果我们这样做会发生什么parray[1]pint[1]?第一个将通过sizeof(int[3])bytes(3 * sizeof(int))提前parray ,第二个将仅提前sizeof( int* )字节.所以实际上,当第一个给你正确的数组时array[0][1],第二个会给你( char * )array[0] + sizeof( int* ),这是我们真正不想要它的地方.但抓住错误的偏移并不是全部.因为它不知道一个数组访问,就会试图解释什么是pint[1]作为一个int*.假设您的阵列已初始化0x00.然后它将根据地址0x00(pint[1][0]例如,做)执行下一个索引步骤.哦不 - 完全未定义的行为!因此强调差异非常重要.

结论

这比你要求的要多,但我认为了解这些细节非常重要.特别是如果你想将2d数组传递给函数,那么这些知识非常有用.



2> ChrisN..:

这是一个二维数组,其中每个元素都是指向a的指针int,所有指针都初始化为零.

在您的后续操作中,您将显示数组的使用方式如下:

if(userMask[2][maskElement][user] && blah)
    result = true;

在这种情况下,每个元素userMask实际上应该指向一个ints 数组.(int*可以指向单个int或一个ints 数组).要确定这一点,请检查为其分配值的代码userMask.例如,可以写:

int userArray[2] = { 10, 20 };

userMask[0][0] = userArray; // userMask[0][0] points to the
                            // first element of userArray.

然后以下代码索引到userArray:

int value = userMask[0][0][1]; // sets value = userArray[1], giving 20.



3> Robert Gambl..:
int *userMask[3][4] = {0};

是一个二维数组,其中每个成员都是一个指向int的指针.此外,所有成员都初始化为空指针.

int (*userMask)[3][4];

将是指向二维int数组的指针.C中的括号比*更紧密,因此需要括号来创建指向数组的指针.

cdecl 是一个简单的实用程序,您可以下载来解释复杂的声明:

cdecl> explain int *userMask[3][4]
declare userMask as array 3 of array 4 of pointer to int

它也可以做相反的事情:

cdecl> declare userMask as pointer to array 3 of array 4 of int
int (*userMask)[3][4]

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有